package com.yangl.corejava.thread.threadpool;


import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;


///ConcurrentHashMap
/**
 *
 * 〈一句话功能简述〉
 * 〈功能详细描述〉
 * @author yangl
 * @version 2015年8月26日
 * @see CallableTestThread
 * @since
 */
public class CallableTestThread
{
    /**
     * 程序的入口
     * Description: <br>
     * 1、…<br>
     * 2、…<br>
     * Implement: <br>
     * 1、…<br>
     * 2、…<br>
     *
     * @param args sss
     * @throws ExecutionException   sss
     * @throws InterruptedException ss
     * @see
     */
    public static void main(String[] args)
            throws ExecutionException, InterruptedException
    {
        System.out.println("----程序开始运行----");
        Date date1 = new Date();
        int taskSize = 5;
        // 创建一个线程池
        ExecutorService pool = Executors.newFixedThreadPool(taskSize);
        // 创建多个有返回值的任务
        List<Future<Integer>> list = new ArrayList<Future<Integer>>();
        for (int i = 0; i < taskSize; i++ )
        {
            /**
             *
             */
            Callable<Integer> c = new MyCallable(i);
            // 执行任务并获取Future对象
            Future<Integer> f = pool.submit(c);
            // System.out.println(">>>" + f.get().toString());
            list.add(f);
        }
        // 关闭线程池
        pool.shutdown();
        // 获取所有并发任务的运行结果
        for (Future<Integer> f : list)
        {
            // 从Future对象上获取任务的返回值，并输出到控制台
            System.out.println(">>>" + f.get().toString());
        }
        Date date2 = new Date();
        System.out.println("----程序结束运行----，程序运行时间【" + (date2.getTime() - date1.getTime()) + "毫秒】");
    }
}


/**
 *
 * 〈一句话功能简述〉
 * 〈功能详细描述〉
 * @author shuenjian
 * @version 2015年8月27日
 * @see MyCallable
 * @since
 */
class MyCallable implements Callable<Integer>
{
    /**
     * 任务数
     */
    private String taskNum;

    public String getTaskNum()
    {
        return taskNum;
    }

    public void setTaskNum(String taskNum)
    {
        this.taskNum = taskNum;
    }

    MyCallable(Integer taskNum)
    {
        this.taskNum = taskNum.toString();
    }

    public Integer call()
            throws Exception
    {
        System.out.println(">>>" + taskNum + "任务启动");
        Date dateTmp1 = new Date();
        Thread.sleep(1000);
        Date dateTmp2 = new Date();
        long time = dateTmp2.getTime() - dateTmp1.getTime();
        System.out.println(">>>" + taskNum + "任务终止");
        return Integer.parseInt(taskNum);
    }
}